#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
小程序页面跳转关系分析工具
生成Excel文件展示所有页面之间的逻辑关系
"""

import json
import os
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter

# 页面信息定义
PAGES = {
    'login': {'name': '登录页面', 'path': 'pages/login/login', 'type': 'entry'},
    'welcome': {'name': '欢迎页面', 'path': 'pages/welcome/welcome', 'type': 'entry'},
    'home': {'name': '消息/工作台', 'path': 'pages/main/home/home', 'type': 'tabbar'},
    'organization': {'name': '组织', 'path': 'pages/main/organization/organization', 'type': 'tabbar'},
    'application': {'name': '应用', 'path': 'pages/main/application/application', 'type': 'tabbar'},
    'create': {'name': '新建', 'path': 'pages/main/create/create', 'type': 'tabbar'},
    'profile': {'name': '我', 'path': 'pages/main/profile/profile', 'type': 'tabbar'},
    'app-category': {'name': '应用分类', 'path': 'pages/main/app-category/app-category', 'type': 'normal'},
    'app-center': {'name': '应用中心', 'path': 'pages/main/app-center/app-center', 'type': 'normal'},
    'app-detail': {'name': '项目详情', 'path': 'pages/main/app-detail/app-detail', 'type': 'normal'},
    'global-search': {'name': '全局搜索', 'path': 'pages/main/global-search/global-search', 'type': 'normal'},
    'addproject': {'name': '添加项目', 'path': 'pages/create/addproject/addproject', 'type': 'normal'},
    'map-marker': {'name': '地图标注', 'path': 'pages/main/map-marker/map-marker', 'type': 'normal'},
    'estimate-result': {'name': '估价结果', 'path': 'pages/main/estimate-result/estimate-result', 'type': 'normal'},
    'apply-workorder': {'name': '申请工单', 'path': 'pages/main/workorder/apply-workorder/apply-workorder', 'type': 'normal'},
    'apply-record': {'name': '申请记录', 'path': 'pages/main/workorder/apply-record/apply-record', 'type': 'normal'},
    'process-workorder': {'name': '处理工单', 'path': 'pages/main/workorder/process-workorder/process-workorder', 'type': 'normal'},
    'process-record': {'name': '处理记录', 'path': 'pages/main/workorder/process-record/process-record', 'type': 'normal'},
    'workorder-detail': {'name': '工单详情', 'path': 'pages/main/workorder/workorder-detail/workorder-detail', 'type': 'normal'},
    'pending-submit': {'name': '待提交审核', 'path': 'pages/main/pending-submit/pending-submit', 'type': 'normal'},
    'app-management': {'name': '应用管理', 'path': 'pages/admin/app-management/app-management', 'type': 'admin'},
    'permission-management': {'name': '用户权限管理', 'path': 'pages/admin/permission-management/permission-management', 'type': 'admin'},
    'user-permission-detail': {'name': '用户权限详情', 'path': 'pages/admin/user-permission-detail/user-permission-detail', 'type': 'admin'},
    'role-permissions': {'name': '角色权限', 'path': 'pages/admin/role-permissions/role-permissions', 'type': 'admin'},
    'meeting-application': {'name': '会议申请', 'path': 'pages/main/admin-apps/meeting-application/meeting-application', 'type': 'normal'},
}

# 页面跳转关系定义（线性逻辑）
PAGE_FLOWS = [
    # 1. 登录流程
    {'from': 'login', 'to': 'welcome', 'method': 'redirectTo', 'condition': '登录成功后', 'description': '登录成功跳转到欢迎页面'},
    
    # 2. 欢迎页面流程
    {'from': 'welcome', 'to': 'home', 'method': 'switchTab', 'condition': '点击进入工作台', 'description': '从欢迎页面进入工作台（消息页面）'},
    
    # 3. 底部导航栏切换（TabBar）
    {'from': 'home', 'to': 'organization', 'method': 'switchTab', 'condition': '点击底部导航栏"组织"', 'description': '切换到组织页面'},
    {'from': 'home', 'to': 'application', 'method': 'switchTab', 'condition': '点击底部导航栏"应用"', 'description': '切换到应用页面'},
    {'from': 'home', 'to': 'create', 'method': 'switchTab', 'condition': '点击底部导航栏"新建"', 'description': '切换到新建页面'},
    {'from': 'home', 'to': 'profile', 'method': 'switchTab', 'condition': '点击底部导航栏"我"', 'description': '切换到个人中心页面'},
    {'from': 'organization', 'to': 'home', 'method': 'switchTab', 'condition': '点击底部导航栏"消息"', 'description': '切换到消息页面'},
    {'from': 'organization', 'to': 'application', 'method': 'switchTab', 'condition': '点击底部导航栏"应用"', 'description': '切换到应用页面'},
    {'from': 'organization', 'to': 'create', 'method': 'switchTab', 'condition': '点击底部导航栏"新建"', 'description': '切换到新建页面'},
    {'from': 'organization', 'to': 'profile', 'method': 'switchTab', 'condition': '点击底部导航栏"我"', 'description': '切换到个人中心页面'},
    {'from': 'application', 'to': 'home', 'method': 'switchTab', 'condition': '点击底部导航栏"消息"', 'description': '切换到消息页面'},
    {'from': 'application', 'to': 'organization', 'method': 'switchTab', 'condition': '点击底部导航栏"组织"', 'description': '切换到组织页面'},
    {'from': 'application', 'to': 'create', 'method': 'switchTab', 'condition': '点击底部导航栏"新建"', 'description': '切换到新建页面'},
    {'from': 'application', 'to': 'profile', 'method': 'switchTab', 'condition': '点击底部导航栏"我"', 'description': '切换到个人中心页面'},
    {'from': 'create', 'to': 'home', 'method': 'switchTab', 'condition': '点击底部导航栏"消息"', 'description': '切换到消息页面'},
    {'from': 'create', 'to': 'organization', 'method': 'switchTab', 'condition': '点击底部导航栏"组织"', 'description': '切换到组织页面'},
    {'from': 'create', 'to': 'application', 'method': 'switchTab', 'condition': '点击底部导航栏"应用"', 'description': '切换到应用页面'},
    {'from': 'create', 'to': 'profile', 'method': 'switchTab', 'condition': '点击底部导航栏"我"', 'description': '切换到个人中心页面'},
    {'from': 'profile', 'to': 'home', 'method': 'switchTab', 'condition': '点击底部导航栏"消息"', 'description': '切换到消息页面'},
    {'from': 'profile', 'to': 'organization', 'method': 'switchTab', 'condition': '点击底部导航栏"组织"', 'description': '切换到组织页面'},
    {'from': 'profile', 'to': 'application', 'method': 'switchTab', 'condition': '点击底部导航栏"应用"', 'description': '切换到应用页面'},
    {'from': 'profile', 'to': 'create', 'method': 'switchTab', 'condition': '点击底部导航栏"新建"', 'description': '切换到新建页面'},
    
    # 4. 应用页面流程
    {'from': 'application', 'to': 'app-category', 'method': 'navigateTo', 'condition': '点击应用图标', 'description': '点击应用进入应用分类页面'},
    {'from': 'application', 'to': 'global-search', 'method': 'navigateTo', 'condition': '点击搜索按钮', 'description': '点击搜索按钮进入全局搜索页面'},
    
    # 5. 应用分类页面流程
    {'from': 'app-category', 'to': 'app-center', 'method': 'navigateTo', 'condition': '点击小分类（汇总表/一览表）', 'description': '点击小分类进入应用中心页面'},
    {'from': 'app-category', 'to': 'apply-workorder', 'method': 'navigateTo', 'condition': '工单管理-申请工单', 'description': '工单管理应用下点击申请工单'},
    {'from': 'app-category', 'to': 'apply-record', 'method': 'navigateTo', 'condition': '工单管理-申请记录', 'description': '工单管理应用下点击申请记录'},
    {'from': 'app-category', 'to': 'process-workorder', 'method': 'navigateTo', 'condition': '工单管理-处理工单', 'description': '工单管理应用下点击处理工单'},
    {'from': 'app-category', 'to': 'process-record', 'method': 'navigateTo', 'condition': '工单管理-处理记录', 'description': '工单管理应用下点击处理记录'},
    {'from': 'app-category', 'to': 'pending-submit', 'method': 'navigateTo', 'condition': '经纪业务-待提交审核', 'description': '经纪业务应用下点击待提交审核'},
    
    # 6. 应用中心页面流程
    {'from': 'app-center', 'to': 'app-detail', 'method': 'navigateTo', 'condition': '点击项目/应用项', 'description': '点击项目进入项目详情页面'},
    
    # 7. 项目详情页面流程
    {'from': 'app-detail', 'to': 'map-marker', 'method': 'navigateTo', 'condition': '点击"地图标注"按钮', 'description': '从项目详情进入地图标注页面'},
    {'from': 'app-detail', 'to': 'estimate-result', 'method': 'navigateTo', 'condition': '点击"估价结果"按钮', 'description': '从项目详情进入估价结果页面'},
    
    # 8. 全局搜索页面流程
    {'from': 'global-search', 'to': 'app-detail', 'method': 'navigateTo', 'condition': '点击搜索结果项目', 'description': '从全局搜索点击项目进入项目详情'},
    
    # 9. 新建页面流程
    {'from': 'create', 'to': 'addproject', 'method': 'navigateTo', 'condition': '点击新建功能（如估价项目、资产项目等）', 'description': '点击新建功能进入添加项目页面'},
    
    # 10. 工单相关页面流程
    {'from': 'apply-workorder', 'to': 'home', 'method': 'navigateBack', 'condition': '提交工单成功后', 'description': '提交工单后返回上一页'},
    {'from': 'apply-record', 'to': 'workorder-detail', 'method': 'navigateTo', 'condition': '点击申请记录中的工单', 'description': '从申请记录进入工单详情'},
    {'from': 'process-workorder', 'to': 'workorder-detail', 'method': 'navigateTo', 'condition': '点击待处理工单', 'description': '从处理工单列表进入工单详情'},
    {'from': 'process-record', 'to': 'workorder-detail', 'method': 'navigateTo', 'condition': '点击处理记录中的工单', 'description': '从处理记录进入工单详情'},
    
    # 11. 个人中心页面流程
    {'from': 'profile', 'to': 'app-management', 'method': 'navigateTo', 'condition': '管理员-应用与权限管理-应用管理', 'description': '管理员进入应用管理页面'},
    {'from': 'profile', 'to': 'permission-management', 'method': 'navigateTo', 'condition': '管理员-应用与权限管理-用户权限', 'description': '管理员进入用户权限管理页面'},
    {'from': 'profile', 'to': 'role-permissions', 'method': 'navigateTo', 'condition': '管理员-应用与权限管理-角色权限', 'description': '管理员进入角色权限页面'},
    {'from': 'permission-management', 'to': 'user-permission-detail', 'method': 'navigateTo', 'condition': '点击用户', 'description': '从用户权限管理进入用户权限详情'},
    
    # 12. 消息页面流程
    {'from': 'home', 'to': 'app-detail', 'method': 'navigateTo', 'condition': '点击消息中的项目信息', 'description': '从消息页面点击项目信息跳转到项目详情'},
    
    # 13. 返回流程
    {'from': 'app-detail', 'to': 'app-center', 'method': 'navigateBack', 'condition': '点击返回按钮', 'description': '从项目详情返回应用中心'},
    {'from': 'map-marker', 'to': 'app-detail', 'method': 'navigateBack', 'condition': '点击返回按钮', 'description': '从地图标注返回项目详情'},
    {'from': 'estimate-result', 'to': 'app-detail', 'method': 'navigateBack', 'condition': '点击返回按钮', 'description': '从估价结果返回项目详情'},
    {'from': 'addproject', 'to': 'create', 'method': 'navigateBack', 'condition': '提交成功后或点击返回', 'description': '从添加项目返回新建页面'},
    {'from': 'user-permission-detail', 'to': 'permission-management', 'method': 'navigateBack', 'condition': '点击返回按钮', 'description': '从用户权限详情返回用户权限管理'},
]

def create_excel():
    """创建Excel文件"""
    wb = Workbook()
    ws = wb.active
    ws.title = "页面跳转关系"
    
    # 设置列宽
    ws.column_dimensions['A'].width = 25
    ws.column_dimensions['B'].width = 25
    ws.column_dimensions['C'].width = 15
    ws.column_dimensions['D'].width = 30
    ws.column_dimensions['E'].width = 50
    ws.column_dimensions['F'].width = 20
    
    # 定义样式
    header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
    header_font = Font(bold=True, color="FFFFFF", size=12)
    border = Border(
        left=Side(style='thin'),
        right=Side(style='thin'),
        top=Side(style='thin'),
        bottom=Side(style='thin')
    )
    center_alignment = Alignment(horizontal='center', vertical='center')
    left_alignment = Alignment(horizontal='left', vertical='center', wrap_text=True)
    
    # 表头
    headers = ['起始页面', '目标页面', '跳转方式', '触发条件', '说明', '页面类型']
    for col_idx, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col_idx, value=header)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = center_alignment
        cell.border = border
    
    # 填充数据
    row = 2
    for flow in PAGE_FLOWS:
        from_page = PAGES.get(flow['from'], {}).get('name', flow['from'])
        to_page = PAGES.get(flow['to'], {}).get('name', flow['to'])
        method = flow['method']
        condition = flow['condition']
        description = flow['description']
        from_type = PAGES.get(flow['from'], {}).get('type', 'normal')
        to_type = PAGES.get(flow['to'], {}).get('type', 'normal')
        page_type = f"{from_type} → {to_type}"
        
        ws.cell(row=row, column=1, value=from_page).alignment = left_alignment
        ws.cell(row=row, column=2, value=to_page).alignment = left_alignment
        ws.cell(row=row, column=3, value=method).alignment = center_alignment
        ws.cell(row=row, column=4, value=condition).alignment = left_alignment
        ws.cell(row=row, column=5, value=description).alignment = left_alignment
        ws.cell(row=row, column=6, value=page_type).alignment = center_alignment
        
        # 设置边框
        for col in range(1, 7):
            ws.cell(row=row, column=col).border = border
        
        # 根据跳转方式设置不同颜色
        if method == 'switchTab':
            fill = PatternFill(start_color="E8F5E9", end_color="E8F5E9", fill_type="solid")
        elif method == 'navigateTo':
            fill = PatternFill(start_color="E3F2FD", end_color="E3F2FD", fill_type="solid")
        elif method == 'redirectTo':
            fill = PatternFill(start_color="FFF3E0", end_color="FFF3E0", fill_type="solid")
        elif method == 'navigateBack':
            fill = PatternFill(start_color="FCE4EC", end_color="FCE4EC", fill_type="solid")
        else:
            fill = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
        
        for col in range(1, 7):
            ws.cell(row=row, column=col).fill = fill
        
        row += 1
    
    # 创建页面信息表
    ws2 = wb.create_sheet("页面信息")
    ws2.column_dimensions['A'].width = 20
    ws2.column_dimensions['B'].width = 40
    ws2.column_dimensions['C'].width = 15
    
    headers2 = ['页面标识', '页面名称', '页面类型']
    for col_idx, header in enumerate(headers2, 1):
        cell = ws2.cell(row=1, column=col_idx, value=header)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = center_alignment
        cell.border = border
    
    row = 2
    for page_id, page_info in PAGES.items():
        ws2.cell(row=row, column=1, value=page_id).alignment = left_alignment
        ws2.cell(row=row, column=2, value=page_info['name']).alignment = left_alignment
        ws2.cell(row=row, column=3, value=page_info['type']).alignment = center_alignment
        
        for col in range(1, 4):
            ws2.cell(row=row, column=col).border = border
        
        # 根据页面类型设置颜色
        if page_info['type'] == 'tabbar':
            fill = PatternFill(start_color="E8F5E9", end_color="E8F5E9", fill_type="solid")
        elif page_info['type'] == 'entry':
            fill = PatternFill(start_color="FFF3E0", end_color="FFF3E0", fill_type="solid")
        elif page_info['type'] == 'admin':
            fill = PatternFill(start_color="FCE4EC", end_color="FCE4EC", fill_type="solid")
        else:
            fill = PatternFill(start_color="E3F2FD", end_color="E3F2FD", fill_type="solid")
        
        for col in range(1, 4):
            ws2.cell(row=row, column=col).fill = fill
        
        row += 1
    
    # 创建线性流程图
    ws3 = wb.create_sheet("线性流程图")
    ws3.column_dimensions['A'].width = 80
    
    headers3 = ['页面跳转流程（线性逻辑）']
    cell = ws3.cell(row=1, column=1, value=headers3[0])
    cell.fill = header_fill
    cell.font = header_font
    cell.alignment = center_alignment
    cell.border = border
    
    # 生成线性流程
    linear_flows = [
        "1. 登录流程",
        "   登录页面 → 欢迎页面（登录成功后）",
        "",
        "2. 欢迎页面流程",
        "   欢迎页面 → 消息/工作台（点击进入工作台）",
        "",
        "3. 底部导航栏切换（TabBar页面）",
        "   消息 ↔ 组织 ↔ 应用 ↔ 新建 ↔ 我（通过底部导航栏切换）",
        "",
        "4. 应用页面流程",
        "   应用页面 → 应用分类（点击应用图标）",
        "   应用页面 → 全局搜索（点击搜索按钮）",
        "",
        "5. 应用分类页面流程",
        "   应用分类 → 应用中心（点击小分类-汇总表/一览表）",
        "   应用分类 → 申请工单（工单管理-申请工单）",
        "   应用分类 → 申请记录（工单管理-申请记录）",
        "   应用分类 → 处理工单（工单管理-处理工单）",
        "   应用分类 → 处理记录（工单管理-处理记录）",
        "   应用分类 → 待提交审核（经纪业务-待提交审核）",
        "",
        "6. 应用中心页面流程",
        "   应用中心 → 项目详情（点击项目/应用项）",
        "",
        "7. 项目详情页面流程",
        "   项目详情 → 地图标注（点击'地图标注'按钮）",
        "   项目详情 → 估价结果（点击'估价结果'按钮）",
        "",
        "8. 全局搜索页面流程",
        "   全局搜索 → 项目详情（点击搜索结果项目）",
        "",
        "9. 新建页面流程",
        "   新建页面 → 添加项目（点击新建功能，如估价项目、资产项目等）",
        "",
        "10. 工单相关页面流程",
        "    申请工单 → 返回（提交工单成功后）",
        "    申请记录 → 工单详情（点击申请记录中的工单）",
        "    处理工单 → 工单详情（点击待处理工单）",
        "    处理记录 → 工单详情（点击处理记录中的工单）",
        "",
        "11. 个人中心页面流程（管理员）",
        "    我 → 应用管理（管理员-应用与权限管理-应用管理）",
        "    我 → 用户权限管理（管理员-应用与权限管理-用户权限）",
        "    我 → 角色权限（管理员-应用与权限管理-角色权限）",
        "    用户权限管理 → 用户权限详情（点击用户）",
        "",
        "12. 消息页面流程",
        "    消息/工作台 → 项目详情（点击消息中的项目信息）",
        "",
        "13. 返回流程",
        "    项目详情 → 应用中心（点击返回按钮）",
        "    地图标注 → 项目详情（点击返回按钮）",
        "    估价结果 → 项目详情（点击返回按钮）",
        "    添加项目 → 新建页面（提交成功后或点击返回）",
        "    用户权限详情 → 用户权限管理（点击返回按钮）",
    ]
    
    row = 2
    for flow_text in linear_flows:
        cell = ws3.cell(row=row, column=1, value=flow_text)
        cell.alignment = left_alignment
        cell.border = border
        if flow_text and not flow_text.startswith(" ") and flow_text[0].isdigit():
            # 主标题
            cell.font = Font(bold=True, size=12)
            cell.fill = PatternFill(start_color="E3F2FD", end_color="E3F2FD", fill_type="solid")
        elif flow_text and flow_text.startswith("   "):
            # 子流程
            cell.font = Font(size=11)
        else:
            # 空行
            pass
        row += 1
    
    return wb

def main():
    """主函数"""
    print("正在生成页面跳转关系Excel文件...")
    
    wb = create_excel()
    
    # 保存文件
    output_file = "小程序页面跳转关系.xlsx"
    wb.save(output_file)
    
    print(f"Excel文件已生成: {output_file}")
    print(f"共包含 {len(PAGE_FLOWS)} 条页面跳转关系")
    print(f"共包含 {len(PAGES)} 个页面")

if __name__ == "__main__":
    main()

